package com.sakiko.controller;

import com.sakiko.pojo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Map;

// 演示接收前端传递的 JSON数据
@Controller
@ResponseBody
@RequestMapping("json")
public class JsonController {
    // get没有请求体
    /*
       1、接收 JSON数据方式有三种:
            handler(String json || Map json || Pojo json)
            String -> 还需要后续处理 jackson -> Map | Pojo -> 获取
            Map -> 可以但不推荐，map只能装数据，但是不能进行数据的校验处理！！ -> 不安全
            实体类 -> 需要提前创建 JSON同等格式类结构 -> 直接使用对象接收 -> 调用 set、get方法 -> 有校验能力 【推荐】
        2、必须指定 @RequestBody 表示要接受请求体中的数据 [json]
      必备的配置:
        问题: String可以接收，使用 map或实体类出现 HTTP status 415 - 不支持的媒体类型 (handlerAdapter不会转化成 map或对象)
        原因: 前端 -> 请求体 -> json字符串 -> handlerAdapter 【json、map、实体类】 -> handler(String | Map | Pojo)
            415 HandlerAdapter不支持格式处理
        解决办法: 导入第三方处理 json格式数据的 jar包 --> jackson  【jackson-databind jackson-core jackson-annotation】
                并将处理能力提供给 handlerAdapter -->   <mvc:annotation-driven/>
     */
    // 需求 1: post /json/data1 {"name":"张三","age":18} --> String json
    @PostMapping("data1")
    public String data1(@RequestBody String json) {
        System.out.println(json);
        return "json.data1";
    }

    // 需求 2: post /json/data2 {"name":"张三","age":18} --> Map jsonMap  【破箱子】
    @PostMapping("data2")
    public String data2(@RequestBody Map json) {
        json.forEach((k, v) -> System.out.println(k + ":" + v));
        return "json.data2";
    }

    // 需求 3: post /json/data3 {"name":"张三","age":18} --> 实体类 对象   【好箱子】
    @PostMapping("data3")
    public String data3(@RequestBody Student json) {
        System.out.println(json.toString());
        return "json.data3";
    }
}

// javaScript Object Notation (js对象表达式)
// 前端 JSON.parse()  JSON.stringify()